[bits 32]  ; 标记是32位的程序

extern printf  ; 声明外部函数printf，系统库函数
extern exit  ; 声明外部函数exit，也是系统库函数

section .text  ; 标记是代码段
global main  ; 导出符号main
main:
    push message  ; 给printf函数准备输入参数，将message压入栈顶
    call printf  ; 调用标准库的prinf()函数
    ;pop eax  ; 调用结束后，将栈顶地址弹出
    add esp, 4  ; 也可将栈寄存器加4的方式，4是地址的字节数，因为不需要获得栈顶数据到eax，直接舍弃即可
    push 0  ; 0是正常退出码
    call exit  ; 调用exit函数退出程序


section .data  ; 标记是数据段
    message db "hello by test_call_std", 10, 13, 0  ; 字符串数据，10是/r 13是/n 0是字符串结束符
    message_end:  ; message结束位置的标签

; 使用以下命令编译：
; nasm -f elf32 test_call_std.asm -o test_call_std.o
; -f elf32是指定输出为elf格式的可重定位文件
; 然后使用gcc链接
; gcc -m32 test_call_std.o -o test_call_std -static
; 如果不加static选项会报重定位只读section .text段的告警 /usr/bin/ld: test_call_std.o: warning: relocation in read-only section `.text'
; 然后执行./test_call_std 可见正确打印message内容
; 这是一个最基本的32位程序，不过依然使用了标准库函数
